home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / CRYSTAL.C < prev    next >
Text File  |  2000-03-21  |  8KB  |  329 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. void    key_wait( void );
  5. #define BIT(i)        (1<<(i))
  6. */
  7. /*
  8. クリスタル
  9. */
  10. #include <xsp2lib.h>
  11. #include "../SPASSION.H"
  12. #include "../player.h"
  13. #include "../enemy.h"
  14. #include "../eshot.h"
  15. #include "../effect.h"
  16. #include "../priority.h"
  17. #include "../sound.h"
  18. #include "../entry.h"
  19. #ifndef NULL
  20. #define NULL ((void *) 0)
  21. #endif
  22.  
  23. #define PALET_MAIN    0x0600
  24.  
  25. static short MoveEnemyCrystal_L( ENEMY *ene );
  26. /*static void TiniEnemyCrystal_L(ENEMY *);*/
  27. static short MoveEnemyCrystal_M( ENEMY *ene );
  28. /*static void TiniEnemyCrystal_M(ENEMY *);*/
  29. static short MoveEnemyCrystal(ENEMY *);
  30. /*static void TiniEnemyCrystal(ENEMY *);*/
  31.  
  32. #define PT_ST_L        0x00
  33. #define PT_END_L    0x02
  34. #define PT_ST        0x10
  35. #define PT_END        0x12
  36.  
  37. static HIT_XY4    hitl_p[]={-12-PLAYER_HIT_X,-12-PLAYER_HIT_Y,12+PLAYER_HIT_X,12+PLAYER_HIT_Y};
  38. static HIT_XY4    hitl_o[]={-12-OPTION_HIT_X,-12-OPTION_HIT_Y,12+OPTION_HIT_X,12+OPTION_HIT_Y};
  39. static HIT_XY4    hitl_s[]={-12,-12,12,12};
  40.  
  41. static HIT_XY4    hitm_p[]={-12-PLAYER_HIT_X,-12-PLAYER_HIT_Y,12+PLAYER_HIT_X,12+PLAYER_HIT_Y};
  42. static HIT_XY4    hitm_o[]={-12-OPTION_HIT_X,-12-OPTION_HIT_Y,12+OPTION_HIT_X,12+OPTION_HIT_Y};
  43. static HIT_XY4    hitm_s[]={-12,-12,12,12};
  44.  
  45. /* 16x16キャラの当たり判定 */
  46. extern HIT_XY4    hit8_p;
  47. extern HIT_XY4    hit8_o;
  48. extern HIT_XY4    hit8_s;
  49. static unsigned char seed=0;
  50.  
  51. void InitEnemyCrystal_LHit( void )
  52. {
  53. }
  54. void InitEnemyCrystal_MHit( void )
  55. {
  56. }
  57. /* InitEnemyZako00Hitと同じなのでいらない */
  58. void InitEnemyCrystalHit( void )
  59. {
  60. }
  61.  
  62. void InitEnemyCrystal_L(ENEMY *ene)
  63. {
  64.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  65.     ene->vx             = (ene->arg>>8          ) * 32768;        /* 引数の上位バイトをvxにする */
  66.     ene->vy             = ((char)(ene->arg&0xFF)) * 32768;        /* 引数の下位バイトをvyにする */
  67.     ene->hit_p[0]     = &hitl_p[0];ene->hit_p[1]=NULL;
  68.     ene->hit_o[0]     = &hitl_o[0];ene->hit_o[1]=NULL;
  69.     ene->hit_s[0]     = &hitl_s[0];ene->hit_s[1]=NULL;
  70.     ene->hp             = 20;
  71.     ene->no_dead     = 0;
  72.     ene->func_enemy_move = MoveEnemyCrystal_L;
  73. /*    ene->func_enemy_tini = TiniEnemyCrystal_L;*/
  74.  
  75. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  76. }
  77.  
  78.  
  79. void InitEnemyCrystal_M(ENEMY *ene)
  80. {
  81.     /* 分裂前より速度を落とす */
  82.     if( ene->parent->vx>>16 > (ene->vx = -(rndtable[seed++] & 0x7)) )
  83.         ene->vx=ene->parent->vx;
  84.     else
  85.         ene->vx *= 32768;
  86.     seed&=255;
  87.  
  88.     if( ene->parent->vy>>16 > (ene->vy = -(rndtable[seed++] & 0x3)) )
  89.         ene->vy=ene->parent->vy;
  90.     else
  91.         ene->vy *= 32768;
  92.     seed&=255;
  93.  
  94.     if( rndtable[seed++]>127 )
  95.         ene->vy *= -1;
  96.     seed&=255;
  97.     if( ene->vx > 0 )
  98.         ene->vx *= -1;
  99.     if( !ene->vx && !ene->vy )
  100.         ene->vx = -65536/4;
  101. /*printf("vx=%d vy=%d vx=%d vy=%d\n",ene->vx,ene->vy,ene->vx>>16,ene->vy>>16);
  102. key_wait();
  103. */
  104.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  105.     ene->hit_p[0]     = &hitm_p[0];ene->hit_p[1]=NULL;
  106.     ene->hit_o[0]     = &hitm_o[0];ene->hit_o[1]=NULL;
  107.     ene->hit_s[0]     = &hitm_s[0];ene->hit_s[1]=NULL;
  108.     ene->hp             = 10;
  109.     ene->no_dead     = 0;
  110.     ene->func_enemy_move = MoveEnemyCrystal_M;
  111. /*    ene->func_enemy_tini = TiniEnemyCrystal_M;*/
  112.  
  113. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  114. }
  115.  
  116. void InitEnemyCrystal(ENEMY *ene)
  117. {
  118.     /* 分裂前より速度を落とす */
  119.     if( ene->parent->vx>>16 > (ene->vx = -(rndtable[seed++] & 0x7)) )
  120.         ene->vx=ene->parent->vx;
  121.     else
  122.         ene->vx *= 32768;
  123.     seed&=255;
  124.  
  125.     if( ene->parent->vy>>16 > (ene->vy = -(rndtable[seed++] & 0x3)) )
  126.         ene->vy=ene->parent->vy;
  127.     else
  128.         ene->vy *= 32768;
  129.     seed&=255;
  130.  
  131.     if( rndtable[seed++]>127 )
  132.         ene->vy *= -1;
  133.     seed&=255;
  134.     if( ene->vx > 0 )
  135.         ene->vx *= -1;
  136.     if( !ene->vx && !ene->vy )
  137.         ene->vx = -65536/4;
  138.  
  139.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  140.     ene->hit_p[0]     = &hit8_p;ene->hit_p[1]=NULL;
  141.     ene->hit_o[0]     = &hit8_o;ene->hit_o[1]=NULL;
  142.     ene->hit_s[0]     = &hit8_s;ene->hit_s[1]=NULL;
  143.     ene->hp             = 5;
  144.     ene->no_dead     = 0;
  145.     ene->func_enemy_move = MoveEnemyCrystal;
  146. /*    ene->func_enemy_tini = TiniEnemyCrystal;*/
  147.  
  148. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  149. }
  150.  
  151.  
  152. static short MoveEnemyCrystal_L( ENEMY *ene )
  153. {
  154.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  155.     ene->x = ((ene->lx += ene->vx) >> 16);
  156.     ene->y = ((ene->ly += ene->vy) >> 16);
  157.  
  158.     ene->pt = obj_obj_b+PT_ST_L+(ene->anim_count++)/8;
  159.     if( ene->pt > obj_obj_b+PT_END_L ){
  160.         ene->pt = obj_obj_b+PT_ST_L;
  161.         ene->anim_count=0;
  162.     }
  163.  
  164. #if 0
  165.     if(ENE_X < 128){
  166.         ene->lx = 192*65536;
  167.         ene->ly = 192*65536;
  168.         ene->vx = 0;
  169.         ene->vy = 0;
  170.     }
  171.     if( BITSNS(0x04) & BIT(1) ){
  172.         while( BITSNS(0x04) & BIT(1) );
  173.         entry_counter_stop = 0;
  174.         return (0);
  175.     }
  176. #endif
  177.  
  178.     /* 画面外に出たら消去 */
  179.     if( ENE_X < 16 - 16 )
  180.         return (0);
  181.  
  182.     /* ダメージを受けた時の処理 */
  183. #if 1
  184.     if(ene->damage){
  185.         SetSE(SE_DAMAGE);    /* 効果音 */
  186.         ene->info = PALET_DAMAGE | PRIORITY_BOSS;    /*パレット変更*/
  187.         if((ene->hp -= ene->damage) <= 0) {
  188.             SetSE(SE_EXPL_CRYSTAL);    /* 爆発音 */
  189.             ene->player->score += 5;
  190.             MakeEnemy(ENEMY_CRYSTAL_M , ene->x  , ene->y, 0,  ene);    /* クリスタル(中)生成 */
  191.             MakeEnemy(ENEMY_CRYSTAL_M , ene->x  , ene->y, 0,  ene);    /* クリスタル(中)生成 */
  192.             return (0);        /* 消去 */
  193.         }
  194.         ene->damage = 0;
  195.     }else
  196.         ene->info = PALET_MAIN | PRIORITY_ZAKO;
  197. #endif
  198.  
  199.     xobj_set_st(ene);
  200.  
  201.     return(1);
  202. }
  203.  
  204.  
  205. static short MoveEnemyCrystal_M( ENEMY *ene )
  206. {
  207.     short    st=5,end=6;
  208.     int        vx=0,vy=0;
  209.  
  210.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  211.     ene->x = ((ene->lx += ene->vx) >> 16);
  212.     ene->y = ((ene->ly += ene->vy) >> 16);
  213.  
  214.     if( ene->vx < 0 )
  215.         vx = ene->vx*-1;
  216.     if( ene->vy < 0 )
  217.         vy = ene->vy*-1;
  218.  
  219. /*printf("0 st=%d,end=%d  \n",st,end);*/
  220.     if( vx > vy ){
  221.         st=5;end=6;
  222.     }else{
  223.         st=3;end=4;
  224.     }
  225.     ene->pt = obj_obj_b+st+(ene->anim_count++)/8;
  226.     if( ene->pt > obj_obj_b+end ){
  227.         ene->pt = obj_obj_b+st;
  228.         ene->anim_count=0;
  229.     }
  230. /*
  231. printf("1 st=%d,end=%d  \n",st,end);
  232. key_wait();
  233. */
  234. #if 0
  235.     if(ENE_X < 128){
  236.         ene->lx = 128*65536;
  237.         ene->ly = 192*65536;
  238.         ene->vx = 0;
  239.         ene->vy = 0;
  240.     }
  241.     if( BITSNS(0x04) & BIT(1) ){
  242.         while( BITSNS(0x04) & BIT(1) );
  243.         entry_counter_stop = 0;
  244.         return (0);
  245.     }
  246. #endif
  247.  
  248.     /* 画面外に出たら消去 */
  249.     if( ENE_X < 16 - 16 )
  250.         return (0);
  251.  
  252.     /* ダメージを受けた時の処理 */
  253. #if 1
  254.     if(ene->damage){
  255.         SetSE(SE_DAMAGE);    /* 効果音 */
  256.         ene->info = PALET_DAMAGE | PRIORITY_BOSS;    /*パレット変更*/
  257.         if((ene->hp -= ene->damage) <= 0) {
  258.             SetSE(SE_EXPL_CRYSTAL);    /* 爆発音 */
  259.             ene->player->score += 3;
  260.             MakeEnemy(ENEMY_CRYSTAL , ene->x  , ene->y, 0,  ene);        /* クリスタル(小)生成 */
  261.             MakeEnemy(ENEMY_CRYSTAL , ene->x  , ene->y, 0,  ene);        /* クリスタル(小)生成 */
  262.             return (0);        /* 消去 */
  263.         }
  264.         ene->damage = 0;
  265.     }else
  266.         ene->info = PALET_MAIN | PRIORITY_ZAKO;
  267. #endif
  268.  
  269.     xobj_set_st(ene);
  270.  
  271.     return(1);
  272. }
  273.  
  274. static short MoveEnemyCrystal( ENEMY *ene )
  275. {
  276.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  277.     ene->x = ((ene->lx += ene->vx) >> 16)-8;    /*-8は表示位置をずらすため*/
  278.     ene->y = ((ene->ly += ene->vy) >> 16)-8;
  279.  
  280.     ene->pt = obj_obj+PT_ST+(ene->anim_count++)/8;
  281.     if( ene->pt > obj_obj+PT_END ){
  282.         ene->pt = obj_obj+PT_ST;
  283.         ene->anim_count=0;
  284.     }
  285.  
  286. #if 0
  287.     if(ENE_X < 128){
  288.         ene->lx = 64*65536;
  289.         ene->ly = 192*65536;
  290.         ene->vx = 0;
  291.         ene->vy = 0;
  292.     }
  293.     if( BITSNS(0x04) & BIT(1) ){
  294.         while( BITSNS(0x04) & BIT(1) );
  295.         entry_counter_stop = 0;
  296.         return (0);
  297.     }
  298. #endif
  299.  
  300.     /* 画面外に出たら消去 */
  301.     if( ENE_X < 16 - 8 )
  302.         return (0);
  303.  
  304.     /* ダメージを受けた時の処理 */
  305. #if 1
  306.     if(ene->damage){
  307.         SetSE(SE_DAMAGE);    /* 効果音 */
  308.         ene->info = PALET_DAMAGE | PRIORITY_BOSS;    /*パレット変更*/
  309.         if((ene->hp -= ene->damage) <= 0) {
  310.             SetSE(SE_EXPL_CRYSTAL_S);    /* 爆発音 */
  311.             ene->player->score += 1;
  312.             return (0);        /* 消去 */
  313.         }
  314.         ene->damage = 0;
  315.     }else
  316.         ene->info = PALET_MAIN | PRIORITY_ZAKO;
  317. #endif
  318.  
  319.     xsp_set_st(ene);
  320.  
  321.     return(1);
  322. }
  323.  
  324. /*
  325. static void TiniEnemyCrystal(ENEMY * p)
  326. {
  327. }
  328. */
  329.